/*
二进制手表顶部有 4 个 LED 代表 小时（0-11），底部的 6 个 LED 代表 分钟（0-59）。

每个 LED 代表一个 0 或 1，最低位在右侧。

例如，上面的二进制手表读取 “3:25”。

给定一个非负整数 n 代表当前 LED 亮着的数量，返回所有可能的时间。

 

示例：

输入: n = 1
返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
 

提示：

输出的顺序没有要求。
小时不会以零开头，比如 “01:00” 是不允许的，应为 “1:00”。
分钟必须由两位数组成，可能会以零开头，比如 “10:2” 是无效的，应为 “10:02”。
超过表示范围（小时 0-11，分钟 0-59）的数据将会被舍弃，也就是说不会出现 "13:00", "0:61" 等时间。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/binary-watch
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
class Solution {
public:
    vector<string> readBinaryWatch(int num) {
        vector<bool> visited(10,false);
        vector<string> res;
        backtracking(res,visited,1,0,num);
        return res;
    }
    //on_num: 当前亮的位数
    void backtracking(vector<string>& res,vector<bool>& visited,int idx,int on_num,int num){
        
        if(on_num==num){
            pair<int,int> p=hour_min(visited);
            int hour=p.first;
            int min=p.second;
            string tmp;
            cout<<hour<<" "<<min<<endl;
            if(0<=hour&&hour<=12){
                /*
                if(hour==12&&min==0){
                    tmp="12:00";
                    res.push_back(tmp);
                }
                */
                if(0<=hour&&hour<12&&0<=min&&min<=59){
                    if(min<10){
                        tmp=to_string(hour)+":0"+to_string(min);
                    }else{
                        tmp=to_string(hour)+":"+to_string(min);
                    }
                    res.push_back(tmp);
                }
            }
            return;
        }

        for(int i=idx;i<=10;i++){
            if(!visited[i-1]){
                visited[i-1]=true;
                backtracking(res,visited,i,on_num+1,num);
                visited[i-1]=false;
            }
        }

    }

    pair<int,int> hour_min(vector<bool>& state){
        int hour=0;
        int min=0;
        for(int i=0;i<state.size();i++){
            if(i<6){
                if(state[i]){
                    min+=pow(2,5-i);
                }
            }else{
                if(state[i]){
                    hour+=pow(2,9-i);
                }
            }
        }
        return make_pair(hour,min);
    }
};